package com.cqc.jdk8.Jutil;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;

/**
 * java.util.Arrays.asList(array)
 * 1 元素是基本类型的array, 不会转成包装类型(int不会变成Integer),会把该数组作为list的第一个元素
 * 2 Arrays.asList()的结果是 java.util.Arrays.ArrayList，不是java.util.ArrayList
 * 3 对array的修改，会影响到asList(array)得到的list
 * 4 Arrays.asList()的结果不能 增加、删除，会报错 java.lang.UnsupportedOperationException。
 * 因为 java.util.Arrays.ArrayList没有重写add remove方法，用的父类 AbstractList的add remove，而它的内部是抛异常
 */
public class ArraysTest {
    @Test
    public void asList1() {
        int[] array = {1, 2, 3};
        //只有一个元素  [1, 2, 3]
        List<int[]> list = Arrays.asList(array);
        for (int[] arr : list) {
            System.out.println(Arrays.toString(arr));
        }
        //但包装类型不同。
        Integer[] array2 = {1, 2, 3};
        //3个元素
        List<Integer> list2 = Arrays.asList(array2);
        for (Integer item : list2) {
            System.out.println(item);
        }
    }


    @Test
    public void asList2() {
        int[] array = {1, 2, 3};
        //错误，java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
        // 实际是私有的 java.util.Arrays.ArrayList
        java.util.ArrayList<int[]> list = (java.util.ArrayList<int[]>) Arrays.asList(array);
    }

    /**
     * Arrays.asList 修改原数组，会影响到list
     */
    @Test
    public void asList3() {
        int[] array = {1, 2, 3};
        List<int[]> list = Arrays.asList(array);
        array[0] = 10;
        //结果是  [10, 2, 3]
        for (int[] arr : list) {
            System.out.println(Arrays.toString(arr));
        }
    }

    /**
     * java.lang.UnsupportedOperationException
     */
    @Test
    public void asList4() {
        String[] array = {"a", "b", "c"};
        //java. util. Arrays. ArrayList
        List<String> list = Arrays.asList(array);
        //list.remove(0);
        list.add("A");
    }

    @Test
    public void sort() {
        // 示例
        System.out.println(sortString("b2a")); // 输出: ab2
        System.out.println(sortString("5a9")); // 输出: a59
    }

    /**
     * 生成并排序包含字母和数字的3位字符串。
     * 首先按照字母顺序排序，然后按照数字顺序排序。
     *
     * @param input 输入的3个字符组成的字符串，可以包含字母和数字。
     * @return 返回排序后的字符串。
     */
    public static String sortString(String input) {
        if (input == null || input.length() != 3) {
            throw new IllegalArgumentException("输入必须是3个字符组成的字符串。");
        }

        char[] chars = input.toCharArray();
        Arrays.sort(chars);

        // 分离字母和数字，分别排序后再合并
        String sortedLetters = "";
        String sortedNumbers = "";
        for (char c : chars) {
            if (Character.isLetter(c)) {
                sortedLetters += c;
            } else if (Character.isDigit(c)) {
                sortedNumbers += c;
            }
        }

        return sortedLetters + sortedNumbers;
    }

}
